// 云对象教程: https://uniapp.dcloud.net.cn/uniCloud/cloud-obj
// jsdoc语法提示教程：https://ask.dcloud.net.cn/docs/#//ask.dcloud.net.cn/article/129
module.exports = {
	_before: function () { // 通用预处理器

	},
	/**
	 * 从数据库获取数据列表
	 * @param table {string} param1 要查询的主表
	 * @param where {string/object} 主表条件
	 * @param order {string} 主表排序
	 * @param field {string} 要查询的主表字段
	 * @param skip {int} 查询开始位置，为0则从头开始
	 * @param limit {int} 单次查询的条数
	 * @param collTable {string} 关联表名
	 * @param collTableField {string} 副标查询的字段
	 * @param collTableWhere{object/string} 副表查询条件
	 * @param collTableOrder {string} 副表排序
	 * @param collTableSkip {int} 副表查询开始位置
	 * @param collTableWhere {int} 副表查询条数
	 * @returns {object},数组在res.data中
	 */
	
	getDataList(table,where={},order="",field=null,skip=0,limit=10,collTable=false,collTableField=null,collTableWhere={},collTableOrder="",collTableSkip=0,collTableLimit=5) {
		// 参数校验，如无参数则不需要
		if (!table) {
			return {
				errCode: '001',
				errMsg: '数据表不能为空'
			}
		}
		try{
			const dbJQL = uniCloud.databaseForJQL({ // 获取JQL database引用，此处需要传入云对象的clientInfo
				clientInfo: this.getClientInfo()
			});
			if(collTable== false){
				return dbJQL.collection(table).where(where).field(field).orderBy(order).skip(skip).limit(limit).get({getCount:true})
			}else{
				const a = dbJQL.collection(table).where(where).field(field).orderBy(order).skip(skip).limit(limit).getTemp();
				const b = dbJQL.collection(collTable).where(collTableWhere).field(collTableField).orderBy(collTableOrder).skip(collTableSkip).limit(collTableLimit).getTemp();
				return dbJQL.collection(a,b).get();
			}
			
			
		}catch(e){
			 return e;
		}
	},
	
	
	/**
	 * 作用：获取单条数据
	 * @param table {string} param1 要查询的主表
	 * @param where {string/object} 主表条件
	 * @param field {string} 要查询的主表字段
	 * @param collTable {string} 关联表名
	 * @param collTableField {string} 副标查询的字段
	 * @param collTableIsGetOne {bool} 副标是否也查询单条
	 * @returns {object},数组在res.data中
	 */
	getDataOne(table,where={},field,collTable=false,collTableField=null,collTableIsGetOne=true){
		try{
		const dbJQL = uniCloud.databaseForJQL({ // 获取JQL database引用，此处需要传入云对象的clientInfo
			clientInfo: this.getClientInfo()
		});
		//如果存在关联表，则为联表查询
		if(collTable!=false){
			const a = dbJQL.collection(table).where(where).field(field).getTemp({getOne:true});
			const b = dbJQL.collection(collTable).field(collTableField).getTemp({getOne:collTableIsGetOne});
			return dbJQL.collection(a,b).get({getOne:true});
		}else{
			return dbJQL.collection(table).where(where).field(field).get({getOne:true});
		}
		}catch(error){
			return error;
		}
	},
	
	/**
	 * 作用：随机分配用户头像和昵称，适合在用户还没有设置头像和昵称的情况下使用
	 * @param 无参数
	 * @return {object} nickname:昵称，headimage:头像地址
	 * 
	*/
   getHeadAndNicknameByRandom(){
	   const url ="https://mp-60d04191-dfc8-47dc-b1e1-36d6fc279352.cdn.bspapp.com/headimage/";
	   const nickname=['吟唱一世浮华','流水浮三生','梧桐深院锁清秋','笔墨初心','君忆流年','梦年海沫深','夜幕篱下浅笙歌','伊人淡雅泪','浅梦丷墨汐',
		   '雨落倾城夜微凉','又闻清风','逝水流年轻染尘','江南春失忆梦','☆完美少年☆','▁倔强こ男孩う','手握风云☆','╰绝版好男人','ヅ不负卿','阳ˉ﹃ˉ光男孩','ず仟種煭酒',
		   '呆萌男神','灲袧漾ξω男人','奶嘴男°]','￡叫兽↘大叔彡','无敌宝宝男m.','冰嚸','男人、永卟言败','挽歌朽哖','木兰の少女心','温柔媚娘╰','尖叫女神ˇ','◆多情女λ',
		   '鸢栀','╰冰箱软妹贴','囚心女神','发光女神','变萌变淑女','花思花醉淚','丬仙女の許愿池','刀子嘴豆心','少女浅夏','悲伤浅笑','_Angel/`妃°','就此长大了╮',
		   '繁花落寂','唇上胭脂味','蝶蝶蝶蝶变','染指唇。','└素年碎碎念','钢铁男儿℃','远离尘埃。','苍笙踏歌','风尘','凉栀°','看淡别离','回忆还温暖。','ζ成全了舍得','南国猫觅海',
		   '栀夏微凉','霓裳晚歌','残翼の梦蝶','眉目成舟し','是梦终空-','夜雨微澜','醉闻晚风','弈剑のㄨ听雨阁','星星の泪光','旧巷念人','风清ゞの云淡ゞ','鸢语','清明雨揽月','青衿.','旧言.',
		   'Drunk(醉梦)','Demons（心魔）','Dear(挚爱)','Emptycity°','The star"星星','adorable°（萌）','Monody(挽歌)','deep love(深情)','离瑰ⅠThekhoi','Appoint（约定）','Perfect″—完美',
		   'Somnus、戒指','Lemon(柠檬)','Shine（光芒）','KRY┃ 控','霸刃魔牛','霸绝天地','爷ゝ本霸气っ','逐云之巅','王牌、送血哥','影丿战魂','幽冥战神','染忆″爷霸气','〃弑神√','王者丶剑啸','霸气╉恋酷',
		   '烽火丶傻瓜','王的风范','冷心为帝','紫月蓝风'
	   ];
	   
	   const nicknameMath = Math.ceil(Math.random()*103);
	   const headimageMath = Math.ceil(Math.random()*20);
	   return {
		   nickname:nickname[nicknameMath],
		   headimage:url+headimageMath+'.jpg'
	   }
   },
   
   
   /**
	* 作用：添加数据到数据库
	* @param table {string} 要插入的表名
	* @param data {object}  插入的数据
	* @return object
	*/
   addDataToDatabase(table,data){
	   if (!table) {
	   	return {
	   		errCode: '001',
	   		errMsg: '数据表不能为空'
	   	}
	   }
	   
	   if (!data) {
	   	return {
	   		errCode: '003',
	   		errMsg: '没有提供任何要添加的数据'
	   	}
	   }
	   
	   try{
		   const dbJQL = uniCloud.databaseForJQL({ // 获取JQL database引用，此处需要传入云对象的clientInfo
		   	clientInfo: this.getClientInfo()
		   });
		   return dbJQL.collection(table).add(data);
	   }catch(e){
		   return e;
	   }
	   
   },
   
   /**
   	* 作用：添加数据到数据库
   	* @param table {string} 要插入的表名
   	* @param data {object}  要修改的数据
	* @param where {object/string} 修改数据需要的条件
   	* @return object
   	*/
   updateDataToDatabase(table,data,where){
   	   if (!table) {
   	   	return {
   	   		errCode: '001',
   	   		errMsg: '数据表不能为空'
   	   	}
   	   }
	   
	   if (!where) {
	   	return {
	   		errCode: '002',
	   		errMsg: '缺少修改数据必须的where'
	   	}
	   }
	   
	   if (!data) {
	   	return {
	   		errCode: '003',
	   		errMsg: '没有提供任何待修改的数据'
	   	}
	   }
	   
   	   
   	   try{
   		   const dbJQL = uniCloud.databaseForJQL({ 
   		   	clientInfo: this.getClientInfo()
   		   });
   		   return dbJQL.collection(table).where(where).update(data);
   	   }catch(e){
   		   return e;
   	   }
   	   
   },
   
   /**
	* 作用：从数据表删除数据
	* @param table {string} 表名
	* @param where {string/object} 条件
	* @param fileList {array} 要删除的文件数组，如果待删除的记录有图片、视频等文件，请务必传递删除
	* @return object
	*/
   removeDataFromDatabase(table,where,fileList=null){
	   try{
	      	const dbJQL = uniCloud.databaseForJQL({ 
	      	clientInfo: this.getClientInfo()
			});
		//判断是否有文件需要删除，如果有文件需要删除，则先删除文件
		if(fileList!=null){
			uniCloud.deleteFile({
			    fileList: fileList
			});
		}
	    return dbJQL.collection(table).where(where).remove();
	   }catch(e){
	    return e;
	   }
	   
   },
   
   /**
	* 作用：删除云存储文件
	* 
	*/
   deleteFileByUniCloud(file){
	   let result = uniCloud.deleteFile({
	       fileList: file
	   });
	   
	   return result;
   },
   
   /**
	* 作用：添加数据到用户操作日志表
	* @param {Object} data:要添加的数据
	*/
   addDataToUserLog(data){
	   const dbJQL = uniCloud.databaseForJQL({
	   clientInfo: this.getClientInfo()
	   });
	   return dbJQL.collection('users_log').add(data);
   },
	/**
	 * 作用：获取客户端信息，clientId保存到opendb-device表
	 * 参数：pushClientid:客户端获取到的push_clientid，应该在App.vue中的onLaunch中获取
	 */
 async addOrUpdateOpendbDevice(pushClientid){
		//获取客户端信息
		var clientInfo = uniCloud.getClientInfos()[0];
		var data = {
			appid:clientInfo.appId,//appid,Uni-xxxxx
			device_id:clientInfo.deviceId,//设备id
			vendor:clientInfo.deviceBrand,//设备厂商，如：xiaomi
			push_clientid:pushClientid,//客户端唯一标识，推送凭据
			oaid:clientInfo.oaid,//oaid
			model:clientInfo.deviceModel,//设备型号
			platform:clientInfo.platform,//平台类型
			uni_platform:clientInfo.uniPlatform,//uni-app 运行平台
			os_name:clientInfo.osName,//操作系统
			os_version:clientInfo.osVersion,//操作系统版本号
			os_language:clientInfo.osLanguage,//操作系统语言
			os_theme:clientInfo.os_theme,//操作系统主题
			pixel_ratio:clientInfo.devicePixelRatio.toString(),//设备像素比
			window_width:clientInfo.windowWidth.toString(),//窗口宽度
			window_height:clientInfo.windowHeight.toString(),//窗口高度
			screen_width:clientInfo.screenWidth.toString(),//滚动宽度
			screen_height:clientInfo.screenHeight.toString(),//滚动高度
			rom_name:clientInfo.romName,//rom名称
			rom_version:clientInfo.romVersion//rom版本
		}
		//根据设备id进行查询，如果存在则更新，如果不存在则创建
		const dbJQL = uniCloud.databaseForJQL({
		clientInfo: this.getClientInfo()
		});
	   const result = await dbJQL.collection('opendb-device').where({
		   device_id:clientInfo.deviceId,
		   push_clientid:pushClientid,
		   appid:clientInfo.appId
			}).get({getOne:true});
		const resultData = result.data;
		if(!resultData){
			return await dbJQL.collection('opendb-device').add(data);
		}else{
			//查看push_clientid有没有变化，如果有则更新，没有则不更新
			if(resultData.push_clientid != data.push_clientid){
				return await dbJQL.collection('opendb-device').where({
		   device_id:clientInfo.deviceId,
		   push_clientid:pushClientid,
		   appid:clientInfo.appId
			}).update({push_clientid:data.push_clientid});
			}else{
				return '设备信息未发生改变，无需添加或更新';
			}
		}
	},
	
	/**
		 * 作用：获取客户端信息，将user_id和clientId保存到uni-id-device表
		 * 参数：pushClientid:客户端获取到的push_clientid，应该在App.vue中的onLaunch中获取
		 * 参数：userId：登录用户的id
		 */
	async addOrUpdateUniIdDevice(userId,pushClientid){
			//获取客户端信息
			var clientInfo = uniCloud.getClientInfos()[0];
			var data = {
				user_id:userId,//用户id
				ua:clientInfo.ua,//userAgent标识
				uuid:clientInfo.deviceId,//设备UUId，默认同设备id
				device_id:clientInfo.deviceId,//设备id
				os_name:clientInfo.osName,//系统名称
				os_version:clientInfo.osVersion,//系统版本
				os_language:clientInfo.osLanguage,//操作系统语言
				os_theme:clientInfo.osTheme,//主题
				vendor:clientInfo.deviceBrand,//设备厂商
				push_clientid:pushClientid,//客户端标识
				oaid:clientInfo.oaid,//设备匿名标识符
				model:clientInfo.deviceModel,//设备型号
				platform:clientInfo.platform//平台类型
			}
			//根据设备id进行查询，如果存在则更新，如果不存在则创建
			const dbJQL = uniCloud.databaseForJQL({
			clientInfo: this.getClientInfo()
			});
			
		   const result = await dbJQL.collection('uni-id-device').where({device_id:clientInfo.deviceId,user_id:data.user_id}).get({getOne:true});
			const resultData = result.data;
			if(!resultData){
				return await dbJQL.collection('uni-id-device').add(data);
			}else{
				//查看push_clientid有没有变化，如果有则更新，没有则不更新
					var update={
						push_clientid:pushClientid,
						last_active_ip:clientInfo.clientIP,
						last_active_date:new Date().getTime(),
						is_login_out:false
					}
					return await dbJQL.collection('uni-id-device').where({device_id:data.device_id,user_id:data.user_id}).update(update);
			}
		},
		
		
		/**
		 * 作用：用户退出时更新uni-id-device表对应记录的登录状态
		 * 参数：userId：即将退出的用户id
		 */
		updateUniIdDeviceLoginStatus(userId){
			//获取客户端信息
			var clientInfo = uniCloud.getClientInfos()[0];
			const dbJQL = uniCloud.databaseForJQL({
			clientInfo: this.getClientInfo()
			});
			
			return dbJQL.collection('uni-id-device').where({device_id:clientInfo.deviceId,user_id:userId}).update({is_login_out:true});
		},
		
		/**
		 * 作用：获取客户端相关信息，目的是方便前端调用
		 * 
		 */
	 async getClientInfo(){
			var clientInfo = await uniCloud.getClientInfos()[0];
			return clientInfo;
		}
  
}
